/**
 * L'etat Menu. Durant cet etat, le menu sera affiche.
 */

#include "includes/menu_state.h"
#include <GL/gl.h>
#include <GL/glut.h>
#include "includes/game.h"
#include "includes/util.h"
#include <stdio.h>

Menu_State_Env * ms_env(){
	return (Menu_State_Env*) game()->menu_state.env;
}

void menu_state_init(){
	
	char labels[MENU_STATE_ITEMS_NB][40] = {"voir", "diriger", "quitter"};
	
	/* Permet de parcourir les items sans les noms a rallonge */
	Menu_Item * item;
	
	/* Indice pour les boucles */
	int i;
	
	/* Fond d'ecran */
	ms_env()->background = util_load_texture("./images/menu/background.png");
	
	/* Item par defaut */
	ms_env()->selected_item = 0;
	
	for(i = 0; i < MENU_STATE_ITEMS_NB; i++){
		item 		= &ms_env()->items[i];
		item->x 	= 300.0;
		item->y		= 300.0 - (i * 50);
		item->w		= 200.0;
		item->h		= 50.0;
		menu_item_texture_init(item, labels[i]);
	}
	
	menu_state_init_gl(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
	
}

void menu_state_init_gl(int width, int height){
	
	/* Limites de la zone de fenetrage */
	glViewport(0, 0, width, height);
	
	/* Modele de projection a changer */
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	
	/* Fenetrage statique en 800 x 600 pour ne pas s'embrouiller */
	glOrtho(0, 800, 0, 600, -1, 1);

	/* Toutes les transformations suivantes s'appliquent au modele de vue */
	glMatrixMode(GL_MODELVIEW);
}

void menu_state_main(){
	
	/* Indice pour les boucles */
	int i;
	
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0);
	glLoadIdentity();
	
	/* On affiche le fond du menu */
	util_display_texture(ms_env()->background, 0.0, 0.0, 800.0, 600.0);
	
	/* On affiche les differents items */
	for(i = 0; i < MENU_STATE_ITEMS_NB; i++){
		
		/* Pour savoir si l'item en cours est celui selectionne */
		int selected = (i == ms_env()->selected_item) ? 1 : 0;
		menu_item_draw(ms_env()->items + i, selected);
	}
	
	glutSwapBuffers();
}

void menu_state_event_keyboard(unsigned char key, int x, int y){
	if(key == 13){
		switch(ms_env()->selected_item){
			/* Bouton voir */
			case 0:
				printf("voir ! \n");
				game()->current_state = &game()->see_state;
				game()->current_state->init_handler();
				break;
			
			/* Bouton "diriger" */
			case 1: 
				printf("Diriger ! \n");
				break;
				
			 /* Bouton "quitter" */
			case 2:
				game_exit();
				break;
				
			default:
				/* Si ca rentre la dedans, il vaut mieux que j'arrete l'info... */
				break;
		}
	}
}

void menu_state_event_special(int key, int x, int y){
	switch(key){
		
		/* Touche "haut" */
		case GLUT_KEY_UP :
			if(ms_env()->selected_item > 0){
				ms_env()->selected_item--;
			}
			break;
			
		/* Touche "bas" */
		case GLUT_KEY_DOWN :
			if(ms_env()->selected_item < MENU_STATE_ITEMS_NB - 1){
				ms_env()->selected_item++;
			}
			break;
			
		default:
			/* Dans tous les autres cas, on ne fait rien */
			break;
	}
	glutPostRedisplay();
}

void menu_state_resize(int width, int height){
	menu_state_init_gl(width, height);
}